import java.util.Arrays;
import java.util.Random;

public class Test {
    //生成一个顺序数组的方法
    public static void order(int[] array){
        for(int i=0;i< array.length;i++){
            array[i]=i;
        }
    }

    //生成一个逆序数组的方法
    public static void reverseOrder(int[] array){
        for(int i=0;i<array.length;i++){
            array[i]= array.length-i;
        }
    }

    //生成一个随机数数组的方法
    public static void randomOrder(int[] array){
        Random random=new Random();
        for(int i=0;i<array.length;i++){
            array[i]= random.nextInt(10_0000);
        }
    }

    //测试冒泡排序时间的方法
    public static void testBubbleSort(int[]array){
        //拷贝一个新的数组
        array= Arrays.copyOf(array,array.length);
        //获取起始时间戳
        long starttime=System.currentTimeMillis();
        ExchangeSort.bubbleSort(array);
        //获取终止时间戳
        long endtime=System.currentTimeMillis();
        //输出耗时
        System.out.println("冒泡排序耗时:"+(endtime-starttime));
    }

    //测试冒泡排序优化形式时间的方法
    public static void testBubbleSort2(int[]array){
        //拷贝一个新的数组
        array= Arrays.copyOf(array,array.length);
        //获取起始时间戳
        long starttime=System.currentTimeMillis();
        ExchangeSort.bubbleSort2(array);
        //获取终止时间戳
        long endtime=System.currentTimeMillis();
        //输出耗时
        System.out.println("冒泡排序优化形式耗时:"+(endtime-starttime));
    }

    //测试Hoare形式快速排序时间的方法
    public static void testHoareQucikSort(int[]array){
        //拷贝一个新的数组
        array= Arrays.copyOf(array,array.length);
        //获取起始时间戳
        long starttime=System.currentTimeMillis();
        ExchangeSort.hoareQuickSort(array);
        //获取终止时间戳
        long endtime=System.currentTimeMillis();
        //输出耗时
        System.out.println("Hoare形式快速排序耗时:"+(endtime-starttime));
    }

    //测试挖坑法形式快速排序时间的方法
    public static void testHoleQucikSort(int[]array){
        //拷贝一个新的数组
        array= Arrays.copyOf(array,array.length);
        //获取起始时间戳
        long starttime=System.currentTimeMillis();
        ExchangeSort.holeQuickSort(array);
        //获取终止时间戳
        long endtime=System.currentTimeMillis();
        //输出耗时
        System.out.println("Hole形式快速排序耗时:"+(endtime-starttime));
    }

    //测试前后指针法形式快速排序时间的方法
    public static void testPointerQucikSort(int[]array){
        //拷贝一个新的数组
        array= Arrays.copyOf(array,array.length);
        //获取起始时间戳
        long starttime=System.currentTimeMillis();
        ExchangeSort.pointerQuickSort(array);
        //获取终止时间戳
        long endtime=System.currentTimeMillis();
        //输出耗时
        System.out.println("Pointer形式快速排序耗时:"+(endtime-starttime));
    }

    //测试Hoare型快速排序的优化形式时间的方法
    public static void testHoareQucikSort2(int[]array){
        //拷贝一个新的数组
        array= Arrays.copyOf(array,array.length);
        //获取起始时间戳
        long starttime=System.currentTimeMillis();
        ExchangeSort.hoareQuickSort2(array);
        //获取终止时间戳
        long endtime=System.currentTimeMillis();
        //输出耗时
        System.out.println("Hoare型快速排序的优化形式耗时:"+(endtime-starttime));
    }

    //测试Hoare型快速排序的非递归形式时间的方法
    public static void testHoareQucikSort3(int[]array){
        //拷贝一个新的数组
        array= Arrays.copyOf(array,array.length);
        //获取起始时间戳
        long starttime=System.currentTimeMillis();
        ExchangeSort.hoareQuickSort3(array);
        //获取终止时间戳
        long endtime=System.currentTimeMillis();
        //输出耗时
        System.out.println("Hoare型快速排序的非递归形式耗时:"+(endtime-starttime));
    }

    public static void main(String[] args) {
        int[]array=new int[1_0000];
        //测试顺序数组情况
        System.out.println("***********************");
        System.out.println("顺序数组情况：");
        order(array);
        testBubbleSort(array);
        testBubbleSort2(array);
        testHoareQucikSort(array);
        testHoleQucikSort(array);
        testPointerQucikSort(array);
        testHoareQucikSort2(array);
        testHoareQucikSort3(array);
        System.out.println("***********************");

        //测试逆序数组情况
        System.out.println("逆序数组情况：");
        reverseOrder(array);
        testBubbleSort(array);
        testBubbleSort2(array);
        testHoareQucikSort(array);
        testHoleQucikSort(array);
        testPointerQucikSort(array);
        testHoareQucikSort2(array);
        testHoareQucikSort3(array);
        System.out.println("***********************");

        //测试随机数组情况
        System.out.println("随机数组情况：");
        randomOrder(array);
        testBubbleSort(array);
        testBubbleSort2(array);
        testHoareQucikSort(array);
        testHoleQucikSort(array);
        testPointerQucikSort(array);
        testHoareQucikSort2(array);
        testHoareQucikSort3(array);
        System.out.println("***********************");

    }
}
